package com.cmw.designpattern.creational.simplefactory;

/**
 * @ClassName VideoFactory
 * @Description: TODO
 * @Author cheng
 * @Date 2020/10/10
 * @Version V1.0
 **/
public class VideoFactory {

    /**
     * (一)、通过类型判断创建对象
     * 简单工厂，通过传入类型标识返回对应的对象
     * 弊端：当有新的 Video 子类要创建时，要增加判断和创建对应实例代码.不符合设计模式开闭原则(软件实体应该对扩展开放,对修改关闭,)
     * @param vedioType
     * @return
     */
    public static Video getVideo(Video.VideoType vedioType){
        Video video = null;
        switch (vedioType){
            case JAVA:
                video = new JavaVedio();
                break;
            case JAVASCRIPT:
                video = new JavaScriptVideo();
                break;
                default:
                    System.err.println("vedioType = [" + vedioType + "]是未知的类型，无法创建实例！");
                    break;
        }
        return video;
    }

    /**
     * (二)、通过反射创建对象
     * 优点：相对第一种通过类型判断来创建对象，通过反射创建对象无须修改代码。符合设计模式开闭原则(软件实体应该对扩展开放,对修改关闭,)
     * @param clz
     * @return
     */
    public static Video getVideo(Class clz){
        try {
            Video video = (Video)Class.forName(clz.getName()).newInstance();
            return video;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
